import __config from '../config'
import es6 from '../lib/es6-promise'
import util from '../utils/util'

const _util = new util

 /** 将wx.request Promise异步化
  * 用法： const app = getApp()
  *       app.$http.GET('/list', {id: '123123'}) //GET,POST,PUT等请求方法
  *          .then(data => console.log(data))
  * @params {String} url 请求地址
  * @params {String} params 请求参数
  */

class HttpRequest {
    constructor() {
        Object.create(null)
        this.__init()
    }

    __init(){
        const self = this
        const methodList = [
                'OPTIONS',
                'GET',
                'HEAD',
                'POST',
                'PUT',
                'DELETE',
                'TRACE',
                'CONNECT',
        ]
        methodList.map(item => {
            this[item] = function(url, params){
                // TODO 验证url params
                // return self.__getPromise(es6.Promise, self.__getResolver(self.__defaultRequest, [item, url, params], self))
                return new es6.Promise((resolve, reject) => {
                    const new_url = `${__config.baseUrl}${url}`
                    //先获取session再进请求
                    _util.getSession()
                    .then(session => {
                        // TODO:测试代码
                        const header = this.setHeader(session)
                        // const header = {
                        //   'session': '587ede45a8d19317',
                        //   'Content-Type': 'application/x-www-form-urlencoded',
                        // }
                        wx.request({
                            method: item,
                            header,
                            url: new_url,
                            data: params,
                            success: res => {
                              try {
                                if(res.data && typeof res.data === 'string'){
                                  res.data = JSON.parse(res.data)
                                }
                              } catch (e) {
                                console.warn(e)
                              } finally {

                              }
                              //TODO 登录失效处理，json序列化处理
                              resolve(res.data)
                            },
                            fail: res => reject(res)
                        })
                    })

                })
            }
        })
    }

    // //构造promise函数
    // __getPromise(Promise, resolver){
    //     if(Promise) return new Promise(resolver)
    //     throw new Error('Promise library doesn\'t exsit')
    // }

    // //构造resolver
    // __getResolver(func, args, context){
    //     return function(resolve, reject){
    //         func.apply(context, args)(resolve, reject)
    //     }
    // }

    // //构造request函数
    // __defaultRequest(method='', url='', params={}){
    //     const new_url = `${__config.baseUrl}${url}`
    //     return function(resolve, reject){
    //         wx.request({
    //             method,
    //             header,
    //             url: new_url,
    //             data: params,
    //             success: res => {
    //                 if(res.data && typeof res.data === 'string'){
    //                     res.data = JSON.parse(res.data)
    //                 }
    //                 //TODO 登录失效处理，json序列化处理
    //                 resolve(res.data)
    //             },
    //             fail: res => reject(res)
    //         })
    //     }
    // }

    //设置请求的header
    setHeader(session){
        return {
            'Content-Type': 'application/x-www-form-urlencoded',
            'session': session
        }
    }
}

export default HttpRequest
